package com.cskaoyan.javase.oop2._1extends._4hierarchy;

/**
 * @description: 继承层次的问题
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 思考:
 *      Java中的一个能不能同时使用extends关键字继承多个?
 *
 *      java的语法规定一个类,使用extends关键字直接继承某个类,最多只能继承一个
 *  这种直接使用extends关键字继承的类称之为"直接父类"
 *  而如果"直接父类"还有父类,那么这个"直接父类的直接父类"就是这个类的"间接父类"
 *  直接父类只能有一个,但是间接父类可能有多个
 *
 * 注意:
 *      1.java中任何一个类(除了Object)都有直接父类,
 *          如果没有extends明确声明它的直接父类,那么它就隐式继承Object
 *      2.这种仅有一个直接父类的继承设计,称之为"单重继承"或者"单继承"
 *          与之相对应的,如果允许一个类直接继承多个类,就是"多重继承"或"多继承"
 *          多继承的优点: 一个类可以同时获得多个类的成员
 *          多继承的缺点: 复杂,很多时候是没有必要的,并且也会带来一些冲突的问题
 *          总之Java没有采取多继承的设计,java的设计者觉得多继承纯属画蛇添足
 *      补充3. Java虽然不支持明面的多继承,但是java实现了真正意义上的多继承
 *          java实际上有办法同时获取多个类的成员,java8至少有下面两个方式:
 *              a.接口(Java8)
 *              b.内部类(1.2)
 *          当然java没有多继承是大家公认的,建议不要去做这种实际意义上的多继承
 *
 *最后Java虽然不支持多重继承，但是父类还有父类，从而形成了继承链
 *
 * 不在同一继承链中的类，没有任何关系（功能角度）
 *   - 继承的东西可以改
 *   - 自己还有扩展的东西
 *
 */
//Class 'Demo' explicitly extends 'java.lang.Object'
public class Demo {
    public static void main(String[] args) {
        Grandson gd = new Grandson();
        //下游的子类对象总是可以用上游的类的引用接收
        Son s = gd;
        Father f = gd;
        Grandfather gf = gd;
        Object o = gd;
    }
}

//Cyclic inheritance involving 'com.cskaoyan.javase.oop2._1extends._4hierarchy.Grandfather'
class Grandfather {
    int grandfatherVar = 1;
}

class Father extends Grandfather {
    int fatherVar = 10;
}

class Father2 {
}

class Father3 {
}

//Class cannot extend multiple classes
//class Son extends Father,Father2,Father3{}
class Son extends Father {
    int sonVar = 100;
}

class Grandson extends Son {
    int grandsonVar = 1000;
}